iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0

今日題目

https://ithelp.ithome.com.tw/upload/images/20230905/20153007f606vXDCC5.png

實作

  1. 引入相關key
    因為今天的題目需要用到搜尋現在旅遊的資訊,因此非常適合使用Google提供的Serpapi(https://serpapi.com/)
from langchain.agents import Tool, AgentExecutor, LLMSingleActionAgent, AgentOutputParser
from langchain.prompts import BaseChatPromptTemplate
from langchain import SerpAPIWrapper, LLMChain
from langchain.chat_models import ChatOpenAI
from typing import List, Union
from langchain.schema import AgentAction, AgentFinish, HumanMessage
import re
import os

OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY')
SERPAPI_API_KEY = os.environ.get('SERPAPI_API_KEY')
  1. 創建一個Serpapi的tool

search = SerpAPIWrapper(serpapi_api_key=SERPAPI_API_KEY)
tools = [
    Tool(
        name = "Search",
        func=search.run,
        description="useful for when you need to search about the state of the world"
    )
]
  1. 創建prompt template,用來定義AI如何做事
template = """Provide the best virtual travel planning for users.The planning includes links about the travel info. You can use the following tools:

{tools}

Use the following format:

Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question

These were previous tasks you completed:



Begin!

Question: {input}
{agent_scratchpad}"""

class CustomPromptTemplate(BaseChatPromptTemplate):
    template: str
    tools: List[Tool]
    
    def format_messages(self, **kwargs) -> str:
        intermediate_steps = kwargs.pop("intermediate_steps")
        thoughts = ""
        for action, observation in intermediate_steps:
            thoughts += action.log
            thoughts += f"\nObservation: {observation}\nThought: "
        kwargs["agent_scratchpad"] = thoughts
        kwargs["tools"] = "\n".join([f"{tool.name}: {tool.description}" for tool in self.tools])
        kwargs["tool_names"] = ", ".join([tool.name for tool in self.tools])
        formatted = self.template.format(**kwargs)
        return [HumanMessage(content=formatted)]
    
prompt = CustomPromptTemplate(
    template=template,
    tools=tools,
    input_variables=["input", "intermediate_steps"]
)

  1. 創建Output Parser,控制輸出的格式

class CustomOutputParser(AgentOutputParser):
    
    def parse(self, llm_output: str) -> Union[AgentAction, AgentFinish]:
        if "Final Answer:" in llm_output:
            return AgentFinish(
                return_values={"output": llm_output.split("Final Answer:")[-1].strip()},
                log=llm_output,
            )
        regex = r"Action\s*\d*\s*:(.*?)\nAction\s*\d*\s*Input\s*\d*\s*:[\s]*(.*)"
        match = re.search(regex, llm_output, re.DOTALL)
        if not match:
            raise ValueError(f"Could not parse LLM output: `{llm_output}`")
        action = match.group(1).strip()
        action_input = match.group(2)
        return AgentAction(tool=action, tool_input=action_input.strip(" ").strip('"'), log=llm_output)
    
output_parser = CustomOutputParser()
  1. 建立LLM,選擇GPT-4的模型

llm = ChatOpenAI(openai_api_key=OPENAI_API_KEY, temperature=0,model="gpt-4")

llm_chain = LLMChain(llm=llm, prompt=prompt)
  1. 建立Agent,並將前面的各部分組合起來
tool_names = [tool.name for tool in tools]

agent = LLMSingleActionAgent(
    llm_chain=llm_chain, 
    output_parser=output_parser,
    stop=["\nObservation:"], 
    allowed_tools=tool_names
)
agent_executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools, verbose=True)
  1. 最後,送出訊息,期待AI的回答吧!!!
agent_executor.run("我想虛擬旅遊到日本京都。")

成果

https://ithelp.ithome.com.tw/upload/images/20230905/20153007Lin1I3ABNq.png

將回答翻成中文 ->

以下是您虛擬旅行到日本京都的一些資源:

  1. 京都虛擬遊覽:在家中舒適地欣賞京都的一些最美麗的地方。
  2. 京都旅遊指南:此指南提供有關京都的觀光和活動的信息。
  3. 一般信息:京都曾是日本的首都,以其眾多的古典佛教寺廟、花園、皇宮、神社和傳統木屋而著稱。它還以如懷石料理等正式傳統而聞名,這是由多道精確菜餚組成的多道菜,還有在祇園地區常見的藝妓。

祝您虛擬旅行愉快!


執行過程

> Entering new AgentExecutor chain...
Thought: The user wants to virtually travel to Kyoto, Japan. I need to find the best virtual tours, travel guides, and other relevant information about Kyoto.
Action: Search
Action Input: Virtual tour of Kyoto, Japan

Observation:Start Your Virtual Kyoto Tour Here. These are some original videos from our guides. Enjoy some of the most wonderful places in Kyoto from the comfort of your ...
I found a virtual tour of Kyoto. Now I need to find some travel guides and other relevant information about Kyoto.
Action: Search
Action Input: Travel guide for Kyoto, Japan

Observation:Other Things to See and Do in Kyoto
I found a travel guide for Kyoto. Now I need to find other relevant information about Kyoto, such as local customs, food, and attractions.
Action: Search
Action Input: Information about Kyoto, Japan

Observation:Kyoto, once the capital of Japan, is a city on the island of Honshu. It's famous for its numerous classical Buddhist temples, as well as gardens, imperial palaces, Shinto shrines and traditional wooden houses. It’s also known for formal traditions such as kaiseki dining, consisting of multiple courses of precise dishes, and geisha, female entertainers often found in the Gion district. ― Google
I now have a comprehensive set of information about Kyoto, including a virtual tour, a travel guide, and general information about the city's culture and attractions.
Final Answer: Here are some resources for your virtual travel to Kyoto, Japan:

1. [Virtual Tour of Kyoto](https://www.virtualtourist.com/travel/Asia/Japan/Kyoto/Kyoto-974803/TravelGuide-Kyoto.html): Enjoy some of the most wonderful places in Kyoto from the comfort of your home.
2. [Travel Guide for Kyoto](https://www.lonelyplanet.com/japan/kansai/kyoto): This guide provides information about things to see and do in Kyoto.
3. General Information: Kyoto, once the capital of Japan, is famous for its numerous classical Buddhist temples, gardens, imperial palaces, Shinto shrines, and traditional wooden houses. It’s also known for formal traditions such as kaiseki dining, consisting of multiple courses of precise dishes, and geisha, female entertainers often found in the Gion district. 

Enjoy your virtual trip!

> Finished chain.

下一篇
Day02 - Langchain Conversation Chain 實作AI教室
系列文
LangChain鸚鵡學院:語言魔法師拿起上AI魔杖,工程師的新時代即將開展4
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
arguskao
iT邦新手 4 級 ‧ 2023-09-06 22:18:06

完全看不懂...

我要留言

立即登入留言